package com.hspedu.generic.cusotmgeneric;

/**
 * @author DL5O
 * @version 1.0
 */
public class CustomInterfaceGeneric {
    public static void main(String[] args) {

    }
}

/**
 *  泛型接口的注意事项和说明
 *  1.接口中，静态成员也不能使用泛型(这个和泛型类规定一样)
 */

//在继承接口 指定泛型接口的类型
interface IA extends IUsb<String,Double>{

}

//当我们去实现IA 接口时，因为IA 在继承IUsb时指定了泛型的类型
// U:String, R:Double
//在实现IUsb接口的方法时，使用String 替换U，使用Double替换R
class AA implements IA{

    @Override
    public Double get(String s) {
        return null;
    }

    @Override
    public void hi(Double aDouble) {

    }

    @Override
    public void run(Double r1, Double r2, String u1, String u2) {

    }
}

//实现接口时，直接指定泛型接口
//给U指定了Integer ，给R指定了Float
//所以，当我们实现IUsb方法时，会使用Integer替换U，使用Float替换R
class BB implements IUsb<Integer,Float>{

    @Override
    public Float get(Integer integer) {
        return null;
    }

    @Override
    public void hi(Float aFloat) {

    }

    @Override
    public void run(Float r1, Float r2, Integer u1, Integer u2) {

    }
}

//没有指定类型，默认为Object
//Object 会替换 U,R
class CC implements IUsb<Object,Object>{

    @Override
    public Object get(Object o) {
        return null;
    }

    @Override
    public void hi(Object o) {

    }

    @Override
    public void run(Object r1, Object r2, Object u1, Object u2) {

    }
}


interface IUsb<U,R>{
    int n = 10;
    //U name =""; 不能使用
    //在普通方法中，可以使用泛型接口
    R get(U u);

    void hi(R r);

    void run(R r1, R r2 , U u1, U u2);

    //在jdk8.0中，可以在接口中，使用默认方法,也是可以使用泛型的
    default R method(U u){
        return null;
    }

}
